# 文件读写 Input / Output


# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# file: 文件路径（相对或者绝对路径）
# mode: 文件打开模式
# encoding: 一般为utf8

# 打开文件的 相对路径 绝对路径

# 重要的打开模型
# r r+ w w+ a a+
# 其他模式
# rb rb+ wb wb+ ab ab+   加上b代表二进制

# 如果以w方式去操作文件  如果文件未找到 则会自动创建
# 而r则不能主动创建

# 普通模式 写入数据为 字符串
# 二进制模式则写入数据必须为 二进制数据  bytes

# a) open(path, mode)  打开文件的读写方式 'w' 'r' 'w+' 'r+' 'wb' 'rb' 'a+'
# b) 文件打开后，处理完该文件，一定要关闭文件  f.close(), 立即释放它使用的所有系统资源。
#     如果你没有显式地关闭文件，Python的垃圾回收器最终将销毁该对象并为你关闭打开的文件，但这个文件可能会保持打开状态一段时间。
#     另外一个风险是不同的Python实现会在不同的时间进行清理
# A 打开文件C 写入 hello world  但是没调用close()
# B 打开文件C 写入 hello python 调用close()
# 以写入方式打开  如果文件不存在 则创建
# 以读取方式打开 如果文件不存在 则报错
# 写入字符串

f = open("str.txt", "w")
f.write("blender插件开发课程")
f.close()

# 读取字符串

f = open("str.txt", "r")
read = f.read()
print(read)
f.close()


# 二进制写入


# 二进制读取


my_list = [[1, 2, 3, 4],
           [2, 3, 4, 5],
           [3, 4, 5, 6]]

pattern = "{} {} {} {}\n"

# 写入
f = open("data.txt", "w")
for sublist in my_list:
    f.write(pattern.format(*sublist))
f.close()

# 读取
read_data = []
f = open("data.txt", "r")
lines = f.readlines()
for line in lines:
    read_data.append([int(i) for i in line.split()])
f.close()
print(read_data)


# c) 自动上下文管理的打开方式 with open(path) as f
# # 以上下文方式打开后 跳出with时 f会自动调用close
# d) 文件的读取 f.read(size) size省略或负数则读取所有，读取到末尾返回一个空字符串''
#     f.readline() 读取一行 遇到一行末尾或者\n 为一行，读到末尾返回空字符串''
# e) List(f) f.readlines() 获取所有行的内容
# f) 文件偏移读取
#     i. f.seek(offset, whence)根据偏移量 移动光标, whence 的 0 值表示从文件开头起算，1 表示使用当前文件位置，2 表示使用文件末尾作为参考点。
#     whence 如果省略则默认值为 0，即使用文件开头作为参考点。
#     ii. f.tell()返回当前光标位置
